﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Dominio;

namespace Persistencia
{
    class BrokerArticulo : Broker
    {
        #region constructor

        public BrokerArticulo()
        {
            this.conn = ConexionBD.getInstance();
        }

        #endregion

        #region methods

        public override void add(Object o)
        {
            Articulo articuloAux = (Articulo)o;
            this.conn.connect();
            string sql = "insert into Articulos(codigo, nombre, imagen,"
                + "descripcion, fechaIngreso, iva) values('"
                + articuloAux.Codigo + "', '" + articuloAux.Nombre 
                + "',  '" + articuloAux.Imagen + "', '" + articuloAux.Descripcion + "', '" 
                + articuloAux.FechaIngreso + "', " 
                + articuloAux.IVA.OID + ")";
            this.conn.execute(sql);
            sql = "insert into ArticulosPrecios(IdArticulo, Fecha, precio, EsCosto, Activo) values ("
                + articuloAux.OID + ", '" + articuloAux.FechaIngreso + "', '" + articuloAux.PrecioVentaActual.Precio
                + "', true, true)";
            this.conn.execute(sql);
            this.conn.disconnect();
        }

        public override void update(Object o)
        {
            Articulo articuloAux = (Articulo)o;
            string sql = "update Articulos set codigo = '" + articuloAux.Codigo
                + "', nombre = '" + articuloAux.Nombre
                + "', imagen = '" + articuloAux.Imagen
                + "', descripcion = '" + articuloAux.Descripcion
                + "', fechaIngreso = '" + articuloAux.FechaIngreso
                + "', habilitado = " + articuloAux.Habilitado
                + ", stock = " + articuloAux.Stock                
                + ", iva = " + articuloAux.IVA.OID
                + " where idArticulo = " + articuloAux.OID;
            this.conn.connect();
            this.conn.execute(sql);
            sql = "update ArticulosPrecios set Activo = false where IdArticulo = "
                + articuloAux.OID + " and Fecha = '" + articuloAux.PrecioVentaAnterior.Fecha
                + "' and precio = " + articuloAux.PrecioVentaAnterior.precio;
            this.conn.execute(sql);
            sql = "insert into ArticulosPrecios(IdArticulo, Fecha, precio, EsCosto, Activo) values ("
                + articuloAux.OID + ", '" + articuloAux.PrecioVentaActual.Fecha 
                + "', '" + articuloAux.PrecioVentaActual.Precio
                + "', true, true)";
            this.conn.disconnect();
        }

        public override void delete(Object o)
        {
            Articulo articuloAux = (Articulo)o;
            string sql = "update articulos set habilitado = false where IdArticulo = " + articuloAux.OID;
            this.conn.connect();
            this.conn.execute(sql);
            this.conn.disconnect();
        }

        public override void bringData(Object o)
        {
            Articulo articuloAux = (Articulo)o;
            this.conn.connect();
            string sql = "Select * from Articulos where IdArticulo = " + articuloAux.OID;
            this.conn.bringData(sql);
            while (this.conn.nextRecord())
            {
                articuloAux.Codigo = this.conn.getDataString("Codigo").ToString();
                articuloAux.Nombre = this.conn.getDataString("Nombre").ToString();                
                articuloAux.Imagen = this.conn.getDataString("Imagen").ToString();
                articuloAux.Descripcion = this.conn.getDataString("Descripcion").ToString();
                articuloAux.FechaIngreso = (DateTime)this.conn.getDataString("FechaIngreso");
                articuloAux.Habilitado = (Boolean)this.conn.getDataString("Habilitado");
                articuloAux.Stock = int.Parse(this.conn.getDataString("Stock").ToString());                
                articuloAux.IVA.OID = int.Parse(this.conn.getDataString("Iva").ToString());                
            }
            sql = "select * from ArticulosPrecios where idArticulo = " + articuloAux.OID
                + " and Activo = true";
            this.conn.bringData(sql);
            while (this.conn.nextRecord())
            {
                articuloAux.PrecioVentaActual.EsCosto = (Boolean)this.conn.getDataString("EsCosto");
                articuloAux.PrecioVentaActual.Fecha = (DateTime)this.conn.getDataString("Fecha");
                articuloAux.PrecioVentaActual.Precio = double.Parse(this.conn.getDataString("Precio").ToString());                
            }
            this.conn.disconnect();
        }

        public override List<Object> bringList(Object o)
        {
            string sql = "Select * from articulos where habilitado = true";
            List<Object> list = new List<Object>();
            this.conn.connect();
            this.conn.bringList(sql);
            while (this.conn.nextRecord())
            {
                Articulo articuloAux = new Articulo();
                articuloAux.Codigo = this.conn.getDataString("Codigo").ToString();
                articuloAux.Nombre = this.conn.getDataString("Nombre").ToString();                
                articuloAux.Imagen = this.conn.getDataString("Imagen").ToString();
                articuloAux.Descripcion = this.conn.getDataString("Descripcion").ToString();
                articuloAux.FechaIngreso = (DateTime)this.conn.getDataString("FechaIngreso");
                articuloAux.Habilitado = (Boolean)this.conn.getDataString("Habilitado");
                articuloAux.Stock = int.Parse(this.conn.getDataString("Stock").ToString());                
                articuloAux.IVA.OID = int.Parse(this.conn.getDataString("Iva").ToString());                
                articuloAux.OID = int.Parse(this.conn.getDataString("IdArticulo").ToString());
                list.Add(articuloAux);
            }
            for (int i = 0; i < list.Count; i++)
            {
                Articulo articuloAux = (Articulo)list[i];
                sql = "select * from ArticulosPrecios where idArticulo = " + articuloAux.OID
                + " and Activo = true";
                this.conn.bringData(sql);
                while (this.conn.nextRecord())
                {
                    articuloAux.PrecioVentaActual.EsCosto = (Boolean)this.conn.getDataString("EsCosto");
                    articuloAux.PrecioVentaActual.Fecha = (DateTime)this.conn.getDataString("Fecha");
                    articuloAux.PrecioVentaActual.Precio = double.Parse(this.conn.getDataString("Precio").ToString());
                }
            }
            this.conn.disconnect();
            return list;
        }

        public override int bringLastId()
        {
            int id = 0;
            try
            {
                this.conn.connect();
                string sql = "Select max(idArticulos) as idArticulo from Articulos";
                this.conn.bringData(sql);
                while (this.conn.nextRecord())
                {
                    id = int.Parse(this.conn.getDataString("idArticulo").ToString());
                }
                this.conn.disconnect();
            }
            catch (Exception)
            {
                this.conn.disconnect();
                id = 0;
            }
            
            return id;
        }

        #endregion
    }
}
